﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using CondominioWeb.Persistencia;
using CondominioWeb.Persistencia.NHibernate;
using CondominioWeb.Dominio;

namespace CondominioWeb.Negocio
{
    public class PagoMorosidadService
    {
        // Dependencias con la capa de persistencia
        public PagoDAO PagoDAO { get; set; }
        public Tipo_PagoDAO Tipo_PagoDAO { get; set; }
        public MantenimientoDAO MantenimientoDAO { get; set; }
        public ResidenteDAO ResidenteDAO { get; set; }
        public Tipo_DocumentoDAO Tipo_DocumentoDAO { get; set; }
        public ViviendaDAO ViviendaDAO { get; set; }
        public SituacionMantenimientoDAO SituacionMantenimientoDAO { get; set; }
        
        // Lógica de negocio
        public Tipo_Documento TipoDocumentoObtener(Int32 nTipoDocumento)
        {
            Tipo_Documento tipoDocumento = Tipo_DocumentoDAO.Obtener(nTipoDocumento);
            return (tipoDocumento);
        }

        public Vivienda ViviendaObtener(Int32 nVivienda)
        {
            Vivienda vivienda = ViviendaDAO.Obtener(nVivienda);
            return (vivienda);
        }

        public Situacion_Mantenimiento SituacionMantenimientoObtener(Int32 nSituacionMantenimiento)
        {
            Situacion_Mantenimiento situacionMantenimiento = SituacionMantenimientoDAO.Obtener(nSituacionMantenimiento);
            return (situacionMantenimiento);
        }

        public Mantenimiento MantenimientoCrear(Mantenimiento mantenimiento)
        {
            return MantenimientoDAO.Crear(mantenimiento);
        }

        public Mantenimiento MantenimientoObtener(Int32 nMantenimiento)
        {
            Mantenimiento mantenimiento = MantenimientoDAO.Obtener(nMantenimiento);
            return (mantenimiento);
        }
        public Mantenimiento MantenimientoModificar(Mantenimiento mantenimiento)
        {
            return MantenimientoDAO.Modificar(mantenimiento);
        }

        public void MantenimientoEliminar(Mantenimiento mantenimiento)
        {
            MantenimientoDAO.Eliminar(mantenimiento);
        }

        public Residente ResidenteCrear(Residente residente)
        {
            return ResidenteDAO.Crear(residente);
        }

        public Residente ResidenteObtener(Int32 nResidente)
        {
            Residente residente = ResidenteDAO.Obtener(nResidente);
            return (residente);
        }
        public Residente ResidenteModificar(Residente residente)
        {
            return ResidenteDAO.Modificar(residente);
        }

        public void ResidenteEliminar(Residente residente)
        {
            ResidenteDAO.Eliminar(residente);
        }

        public ICollection<Residente> ResidentesListado()
        {
            return ResidenteDAO.ListarTodosLosResidentes();
        }

        public Pago RealizarPagoCuota(Int32 PagoCodigo, Int32 mantenimientoCodigo, DateTime FechaPago, string CuentaCargo, string CuentaAbono, string NroTarjeta, Int32 TipoPagoCodigo, Double Monto, string Observaciones, string Estado)
        {
            Mantenimiento mantenimiento = MantenimientoDAO.Obtener(mantenimientoCodigo);
            if (mantenimiento == null)
                throw new Exception("Mantenimiento no registrado...");
            if (Monto == 0 )
                throw new Exception("Importe incorrecto...");
            Tipo_Pago tipoPago = Tipo_PagoDAO.Obtener(TipoPagoCodigo);
            if (tipoPago == null)
                throw new Exception("Tipo de Pago Incorrecto...");
            Pago oPago = new Pago();
            Mantenimiento oMantenimiento = new Mantenimiento();
            oMantenimiento.Codigo_Mantenimiento = mantenimientoCodigo;
            Tipo_Pago oTipoPago = new Tipo_Pago();
            oTipoPago.Codigo_Tipo_Pago = TipoPagoCodigo;

            oPago.PagoCodigo = PagoCodigo;
            oPago.oMantenimiento = oMantenimiento;
            oPago.FechaPago= FechaPago;
            oPago.CuentaCargo= CuentaCargo;
            oPago.CuentaAbono= CuentaAbono;
            oPago.NroTarjeta= NroTarjeta;
            oPago.oTipoPago = oTipoPago; 
            oPago.Monto= Monto;
            oPago.Observaciones= Observaciones;
            oPago.Estado= Estado;

            return PagoDAO.Crear(oPago);
        }

        public ICollection<Mantenimiento> ListarCuotasPendientesPago(Int32 nResidente)
        {
            Residente residente = ResidenteDAO.Obtener(nResidente);
            if (residente == null)
                throw new Exception("Residente no registrado...");

            return MantenimientoDAO.ListarCuotasPendientesPago(nResidente);
        }
        
        public ICollection<Mantenimiento> ListarResidentesMorosos(Int32 nResidente)
        {
            Residente residente = ResidenteDAO.Obtener(nResidente);
            if (residente == null)
                throw new Exception("Residente no registrado...");

            return MantenimientoDAO.ListarResidentesMorosos(nResidente);
        }

        public ICollection<Mantenimiento> MantenimientoListarTodos()
        {
            return MantenimientoDAO.MantenimientoListarTodos();
        }

    }
}